package jp.oesf.rss;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import android.util.Log;
import android.util.Xml;

public class XmlHelper {
	/*
	 * XmlPullparserを使用したXMLの解析
	 *
	 * 入力「String xml」に含まれる有効なタグを解析し
	 * １要素を XmlRowModelに格納する
	 *
	 * itemタグ内の要素を1アイテムとし要素が
	 * 複数要素存在することを考慮し
	 *    ArrayList<XmlRowModel>
	 * で返却する
	 *
	 *
	 * @note ArrayListの生成は呼び出し元で行うこと！
	 * @result true:正常
	 * @result false:異常
	 *
	 */
	public boolean  parseXmlPullparser(String xml, ArrayList<XmlRowModel> arrayList) {

		boolean ret = true;

		XmlRowModel xmlRowModel = null;
		InputStream inputStream = null;
		try {
			XmlPullParser xmlPullParser = null;
			xmlPullParser = Xml.newPullParser();

			//Stringをストリームに変換するしパーサに設定
			inputStream = new ByteArrayInputStream( xml.getBytes());  //.getBytes("utf-8")
			xmlPullParser.setInput(new InputStreamReader(inputStream));

			int eventType = 0;
			// XmlPullParser パースしている階層を取得
			final int depth = xmlPullParser.getDepth();

			// XmlPullParser パースの終了条件
			while (((eventType = xmlPullParser.next()) != XmlPullParser.END_DOCUMENT || xmlPullParser.getDepth() > depth)) {
				// XmlPullParser eventTypeが開始タグか判定
				if (eventType == XmlPullParser.START_TAG) {
					// XmlPullParser タグの名前を取得する
					String tag = xmlPullParser.getName();

					// XmlPullParser タグの名前が"item"なら、parseToRowModelを呼び出す
					if ("item".equals(tag)) {
						xmlRowModel = parseToRowModel(xmlPullParser);
						//リストに追加
						arrayList.add(xmlRowModel);
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			ret = false;
		} finally {
			if (inputStream != null) {
				try {
					inputStream.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return ret;
	}

	/*
	 *	itemタグ内解析
	 *    有効タグは以下
	 *		title
	 *		link
	 *		description
	 *		pubDate
	 *		guid
	 *		category
	 *
	 *
	 * @note 本メソッドでは 戻り値となるXmlRowModelオブジェクトは必ず返却されます
	 *
	 */
	private XmlRowModel parseToRowModel(XmlPullParser parser) throws XmlPullParserException, IOException {

		XmlRowModel rowModel = new XmlRowModel();
		int eventType;
		String tag = null;
		// パースする階層を取得する
		final int depth = parser.getDepth();
		// パースの終了条件
		while (((eventType = parser.next()) != XmlPullParser.END_DOCUMENT || parser.getDepth() > depth)) {
			// eventTypeが開始タグか判定
			if (eventType == XmlPullParser.START_TAG) {
				tag = parser.getName();
				if ("title".equals(tag)){
					parser.next();
					rowModel.setTitle( parser.getText() );
					Log.v("---- title     ----", parser.getText() );
				} else if ("link".equals(tag)){
					parser.next();
					rowModel.setLink( parser.getText() );
					Log.v("---- link       ----", parser.getText() );
				} else if ("description".equals(tag)){
					parser.next();
					rowModel.setDescription( parser.getText() );
					Log.v("---- description ----", parser.getText() );
				} else if ("pubDate".equals(tag)){
					parser.next();
					rowModel.setPubDate( parser.getText() );
					Log.v("---- pubDate     ----", parser.getText() );
				} else if ("guid".equals(tag)){
					parser.next();
					rowModel.setGuid( parser.getText() );
					Log.v("---- guid        ----", parser.getText() );
				} else if ("category".equals(tag)){
					parser.next();
					rowModel.setCategory( parser.getText() );
					Log.v("---- category    ----", parser.getText() );
				}
				// eventTypeが終了タグか判定
			} else if (eventType == XmlPullParser.END_TAG) {
				// タグの名前を取得する
				tag = parser.getName();
				// タグの名前が"item"ならbreakする
				if ("item".equals(tag)) {
					break;
				}
			}
		}
		return rowModel;
	}
	/*
	 *	parseXmlPullparser IF試作用メソッド
	 *
	 * 入力「String xml」に含まれる有効なタグを解析し
	 * １要素を XmlRowModelに格納する
	 *
	 * 複数要素存在することを考慮し
	 *    ArrayList<XmlRowModel>
	 * で返却する
	 *
	 */
	public void parseXmlPullparser_TEST(String xml, ArrayList<XmlRowModel> arrayList) {

		/////////
		//データ1
		/////////
		XmlRowModel xmlRowModel = new XmlRowModel();
		xmlRowModel.setTitle("ET West 2011 開催のご案内");
		xmlRowModel.setDescription(
				"OESFのパートナーである、社団法人 組込みシステム技術協会（JASA)開催のEmbedded"
				+"Technology West 2011が開催されます。"
				+"特別企画ゾーン“Android開発コーナー”やAndroid関連セッションも用意されております。"
				+"是非、多くの方のご来場をお待ちしております。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 《"
				+"関西で唯一の組込み専門技術展＆カンファレンス 》 Embedded Technology West 2011／組込み総合技術展 関西 ■"
				+"会期：2011年6月16日(木)−17日(金) ■ 会場：インテックス大阪 ■"
				+"http://www.jasa.or.jp/etwest/ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
				);

		arrayList.add(xmlRowModel);

		/////////
		//データ2
		/////////
		XmlRowModel xmlRowModel_2 = new XmlRowModel();
		xmlRowModel_2.setTitle("【@IT MONOist】ACE対策問題の連載記事掲載中");
		xmlRowModel_2.setDescription(
				"情報ポータルサイト「＠IT"
				+"MONOist」に、OESF公認Android™技術者認定試験「ACE」の対策問題と詳しい解説が、連載記事として掲載されています。（URL：http://monoist.atmarkit.co.jp/mn/articles/1105/20/news001.html"
				+"）"
				+"ACEの対策問題を解きながら、Android™アプリケーション開発に関わる基礎知識やスキルの取得・確認ができます。ACE受験予定の皆様はもちろんのこと、Android™アプリケーション開発にご関心をお持ちの方々も、この機会にぜひ本連載をご覧ください。"
				+"Android™技術者認定試験「ACE」とは…"
				+"（URL：http://www.oesf.jp/modules/training/index.php?content_id=2）"
		);

		arrayList.add(xmlRowModel_2);

		return;
	}
}
